package data {
	
	// Imports
	
	// Classe
	
	public class Effets {
		
		// Attributs
		
		private var _classiques : Vector.<Effet>;
		private var _critiques  : Vector.<Effet>;
		private var _taux       : int;
		private var _vitalite   : int;
		
		// Accesseurs
		
		public function getClassiques() : Vector.<Effet> {
			return _classiques;
		}
		
		public function setClassiques(classiques : Vector.<Effet>) : void {
			_classiques = classiques;
		}
		
		public function getClassiquesLength() : int {
			return _classiques.length;
		}
		
		public function getClassiqueAt(index : int) : Effet {
			return _classiques[index];
		}
		
		public function setClassiqueAt(classique : Effet, index : int) : void {
			_classiques[index] = classique;
		}
		
		public function delClassiqueAt(index : int) : void {
			for (var i : int = index; i < _classiques.length-1; i++)
				_classiques[i] = _classiques[i + 1];
			_classiques.length = _classiques.length - 1;
		}
		
		public function addClassique(classique : Effet) : void {
			_classiques[_classiques.length] = classique;
		}
		
		public function getCritiques() : Vector.<Effet> {
			return _critiques;
		}
		
		public function setCritiques(critiques : Vector.<Effet>) : void {
			_critiques = critiques;
		}
		
		public function getCritiquesLength() : int {
			return _critiques.length;
		}
		
		public function getCritiqueAt(index : int) : Effet {
			return _critiques[index];
		}
		
		public function setCritiqueAt(critique : Effet, index : int) : void {
			_critiques[index] = critique;
		}
		
		public function delCritiqueAt(index : int) : void {
			for (var i : int = index; i < _critiques.length-1; i++)
				_critiques[i] = _critiques[i + 1];
			_critiques.length = _critiques.length - 1;
		}
		
		public function addCritique(critique : Effet) : void {
			_critiques[_critiques.length] = critique;
		}
		
		public function getTaux() : int {
			return _taux;
		}
		
		public function setTaux(taux : int) : void {
			_taux = taux;
		}
		
		public function getVitalite() : int {
			return _vitalite;
		}
		
		public function setVitalite(vitalite : int) : void {
			_vitalite = vitalite;
		}
		
		// Constructeurs
		
		public function Effets() {
			setClassiques(new Vector.<Effet>());
			setCritiques(new Vector.<Effet>());
			setTaux(0);
			setVitalite(0);
		}
		
		// Méthodes publiques
		
		public function getText(title : String, textMode : Number) : String {
			var flag : Object = {
				details        : (1 == (Math.floor(textMode/Math.pow(2,0))%2)),
				separate_vdv   : (1 == (Math.floor(textMode/Math.pow(2,1))%2)),
				color_or_icone : (1 == (Math.floor(textMode/Math.pow(2,2))%2)),
				death_detector : (1 == (Math.floor(textMode/Math.pow(2,3))%2))
			};
			// Variables communes
			var resultat : String = "";
			var i : int = 0;
			var elem : String = Elem.AUCUN; var elemCN : String = Elem.AUCUN; var elemCC : String = Elem.AUCUN;
			var min  : int = 0; var totalMinCN : int = 0; var totalMinCC : int = 0;
			var max  : int = 0; var totalMaxCN : int = 0; var totalMaxCC : int = 0;
			var taux : int = getTaux();
			var detailsCN : String = "";
			for (i = 0; i < getClassiquesLength(); i++) {
				min  = getClassiqueAt(i).getMin();
				max  = getClassiqueAt(i).getMax();
				elem = getClassiqueAt(i).getElem();
				if (min != 0 || max != 0) {
					totalMinCN += min;
					totalMaxCN += max;
					if (!Elem.isDefined(elemCN))
						elemCN = elem;
					else if (elemCN != elem)
						elemCN = (!Elem.isDefined(elem) ? elem : Elem.MULTI);
					if (flag.details)
						detailsCN += "<li>" + getClassiqueAt(i)._id + ":" + "<font color='" + Elem.getColor(elem) + "'>" + min + "</font>" + ( min >= max ? "" : " à <font color='" + Elem.getColor(elem) + "'>" + max + "</font>" ) + "</li>";
				}
			}
			var detailsCC : String = "";
			for (i = 0; i < getCritiquesLength(); i++) {
				min  = getCritiqueAt(i).getMin();
				max  = getCritiqueAt(i).getMax();
				elem = getCritiqueAt(i).getElem();
				if (min != 0 || max != 0) {
					totalMinCC += min;
					totalMaxCC += max;
					if (!Elem.isDefined(elemCC))
						elemCC = elem;
					else if (elemCC != elem)
						elemCC = (!Elem.isDefined(elem) ? elem : Elem.MULTI);
					if (flag.details)
						detailsCC += "<li>" + getCritiqueAt(i)._id + ":" + "<font color='" + Elem.getColor(elem) + "'>" + min + "</font>" + ( min >= max ? "" : " à <font color='" + Elem.getColor(elem) + "'>" + max + "</font>" ) + "</li>";
				}
			}
			var life : int = getVitalite();
			resultat = "<b>" + title + "</b>" + "<br/>"
				+ "Normal" + ( taux == 0 ? "" : " (" + ( taux - 1 ) + "/" + taux + ")" ) + " : "
				+ ( flag.details ? "<ul>" + ( detailsCN == "" ? "<li>Aucun effet</li>" : detailsCN ) + "</ul>" : ( totalMaxCN == 0 ? "Aucun effet"
					: "<font color='" + Elem.getColor(elemCN) + "'>" + totalMinCN + ( flag.death_detector && life <= totalMinCN ? "<b>!</b>" : "" ) + "</font>"
					+ ( totalMinCN >= totalMaxCN ? "" : " à <font color='" + Elem.getColor(elemCN) + "'>" + totalMaxCN + ( flag.death_detector && life <= totalMaxCN ? "<b>!</b>" : "" ) + "</font>" ) ) + "<br/>" )
				+ ( taux == 0 ? "Pas de coup critique" + ( flag.details ? "<ul></ul>" : "" ) : "Critique" + " (" + 1 + "/" + taux + ") : "
				+ ( flag.details ? "<ul>" + ( detailsCC == "" ? "<li>Aucun effet</li>" : detailsCC ) + "</ul>" : ( totalMaxCC == 0 ? "Aucun effet"
					: "<font color='" + Elem.getColor(elemCC) + "'>" + totalMinCC + ( flag.death_detector && life <= totalMinCC ? "<b>!</b>" : "" ) + "</font>"
					+ ( totalMinCC >= totalMaxCC ? "" : " à <font color='" + Elem.getColor(elemCC) + "'>" + totalMaxCC + ( flag.death_detector && life <= totalMaxCC ? "<b>!</b>" : "" ) + "</font>" ) ) + "" )
				);
			if (flag.death_detector && life > 0) {
				var probaCN : Number = 0;
				if (life <= totalMinCN) {
					probaCN = 100;
				} else if (life <= totalMaxCN) {
					probaCN = 100 * (totalMaxCN - life) / (totalMaxCN - totalMinCN);
				}
				var probaCC : Number = 0;
				if (life <= totalMinCC) {
					probaCC = 100;
				} else if (life <= totalMaxCC) {
					probaCC = 100 * (totalMaxCC - life) / (totalMaxCC - totalMinCC);
				}
				var proba : Number = probaCN;
				if (taux > 0)
					proba = (probaCC + probaCN * (taux - 1)) / taux;
				resultat += (flag.details ? "" : "<br/>") + "Mort de la cible : " + (Math.round(10 * proba) / 10) + "%";
			}
			return  resultat;
		}
		
		// Méthodes privées
		
	}
	
}